﻿using System;
using System.Linq;
using System.Text;
using Biz.Buffer;
using Biz.EF.Gateway.Monitor;
using Biz.EF.Platform;
using Hjt212Parser;
using log4net;

namespace Biz.Process
{
    public class Alarmer
    {
        private static readonly ILog Log = LogManager.GetLogger(typeof(Alarmer));
        public static void TriggerByConcentration(PlatformContext pCtx, GatewayMonitorContext gCtx, string content)
        {
            try
            {
                var mn = Parser.GetStringByKey("MN", content);
                if (string.IsNullOrEmpty(mn)) return;
                var port = CommonInformation.GetLetportByMn(mn);
                if (port == null) return;
                var enterprise = CommonInformation.GetPollutionSourceById(port.企业基本信息ID);
                if (enterprise == null) return;
                var datatime = Parser.GetDateTimeByKey("DataTime", content);
                if (datatime == null) return;


                var now = DateTime.Now;
                if (Math.Abs((now - datatime.Value).TotalMinutes) > 15)
                {
                    Log.Warn("数据时间和当前时间差15分钟以上，认为是补传数据，不发报警信息。");
                    return;
                }

                var begin = new DateTime(datatime.Value.Year, datatime.Value.Month, datatime.Value.Day);
                var end = begin.AddDays(1);

                var codes = Parser.GetPollutantCodes(content);
                StringBuilder sb = new StringBuilder();
                foreach (var code in codes)
                {
                    var value = Parser.GetDoubleByKey(code + "-Rtd", content);
                    if (value == null) continue;
                    var factor = CommonInformation.GetContamCode(code);
                    if (factor == null) continue;
                    var alarmType = CommonInformation.GetConcentrationAlarm(code, value.Value);
                    if (alarmType == AlarmType.None) continue;
                    var item = CommonInformation.GetConcentrationValue(code);
                    if (item == null || item.限制值 == null || item.预警值 == null) continue;
                    sb.Length = 0;
                    sb.Append(enterprise.企业名称)
                        .Append(datatime.Value.ToString("F"))
                        .Append(factor.名称)
                        .Append("排放浓度为")
                        .Append(value.Value).Append("，超过");
                    switch (alarmType)
                    {
                        case AlarmType.ExceedLimit:
                            sb.Append("限制值").Append(item.限制值.Value);
                            break;
                        case AlarmType.ExceedEarlyWarningLessThanLimit:
                            sb.Append("预警值").Append(item.预警值.Value);
                            break;
                    }
                    sb.Append("，请关注！");
                    var alarm = pCtx.报警记录
                        .Where(t => t.企业基本信息ID == port.企业基本信息ID)
                        .Where(t => t.设备信息ID == port.ID)
                        .Where(t => t.时间 >= begin)
                        .Where(t => t.时间 < end).FirstOrDefault(t => t.内容 != null && t.内容.Contains(factor.名称));
                    if (alarm != null) continue;
                    var contacts1 = CommonInformation.GetContacts(mn);
                    foreach (var c1 in contacts1)
                    {
                        var record = new 报警记录
                        {
                            企业基本信息ID = port.企业基本信息ID,
                            设备信息ID = port.ID,
                            时间 = datatime.Value,
                            内容 = sb.ToString(),
                            短信是否发送 = false,
                            是否需要声光报警 = "否",
                            短信接收人 = c1.联系人姓名,
                            短信手机号 = c1.联系人电话
                        };
                        pCtx.报警记录.Add(record);
                    }
                    pCtx.SaveChanges();
                    var contacts2 = CommonInformation.GetEnterpriseContacts(mn);
                    if (contacts2 == null) continue;

                    foreach (var c1 in contacts2)
                    {
                        var record = new 报警记录
                        {
                            企业基本信息ID = port.企业基本信息ID,
                            设备信息ID = port.ID,
                            时间 = datatime.Value,
                            内容 = sb.ToString(),
                            短信是否发送 = false,
                            是否需要声光报警 = "否",
                            短信接收人 = c1.联系人一姓名,
                            短信手机号 = c1.联系人一电话
                        };
                        pCtx.报警记录.Add(record);
                        record = new 报警记录
                        {
                            企业基本信息ID = port.企业基本信息ID,
                            设备信息ID = port.ID,
                            时间 = datatime.Value,
                            内容 = sb.ToString(),
                            短信是否发送 = false,
                            是否需要声光报警 = "否",
                            短信接收人 = c1.联系人二姓名,
                            短信手机号 = c1.联系人二电话
                        };
                        pCtx.报警记录.Add(record);
                    }
                    pCtx.SaveChanges();

                }
            }
            catch (Exception ex)
            {
                Log.Error(ex);
            }
        }

        public static void TriggerByMonthTotal(PlatformContext pCtx, GatewayMonitorContext gCtx, string content)
        {
            try
            {
                var hourCou = Parser.GetDoubleByKey("w00000-Cou", content);
                if (hourCou == null || hourCou.Value < 0.1) return;
                var mn = Parser.GetStringByKey("MN", content);
                if (string.IsNullOrEmpty(mn)) return;
                var port = CommonInformation.GetLetportByMn(mn);
                if (port == null) return;
                var enterprise = CommonInformation.GetPollutionSourceById(port.企业基本信息ID);
                if (enterprise == null) return;
                var datatime = Parser.GetDateTimeByKey("DataTime", content);
                if (datatime == null) return;

                var now = DateTime.Now;
                if (Math.Abs((now - datatime.Value).TotalMinutes) > 75)
                {
                    Log.Warn("数据时间和当前时间差75分钟以上，认为是补传数据，不发报警信息。");
                    return;
                }
                var beginDay = new DateTime(datatime.Value.Year, datatime.Value.Month, datatime.Value.Day);
                var endDay = beginDay.AddDays(1);
                var beginMonth = new DateTime(datatime.Value.Year, datatime.Value.Month, 1);
                var endMonth = beginMonth.AddMonths(1);

                var monthTotal =
                    pCtx.DayDataMains.Where(t => t.监测时间 >= beginMonth).Where(t => t.监测时间 < endMonth).Where(t => t.时段量 != null).Sum(t => t.时段量.Value);
                var monthDay = pCtx.HourDataMains.Where(t => t.监测时间 >= beginDay).Where(t => t.监测时间 < endDay).Where(t => t.时段量 != null).Sum(t => t.时段量.Value);

                var flag = "限制量";

                var alarmType = CommonInformation.GetTotalAlarm(mn, monthTotal + monthDay);
                if (alarmType == AlarmType.None) return;
                var item = CommonInformation.GetTotalValue(mn);
                if (item == null || item.限制量 == null || item.预警量 == null) return;
                StringBuilder sb = new StringBuilder();
                sb.Append(enterprise.企业名称)
                        .Append(datatime.Value.ToString("F"))
                        .Append("污水排放量为")
                        .Append(monthTotal + monthDay).Append("，超过");
                switch (alarmType)
                {
                    case AlarmType.ExceedLimit:
                        sb.Append("限制量").Append(item.限制量.Value);
                        flag = "限制量";
                        break;
                    case AlarmType.ExceedEarlyWarningLessThanLimit:
                        sb.Append("预警量").Append(item.预警量.Value);
                        flag = "预警量";
                        break;
                }
                sb.Append("，请关注！");

                var alarm = pCtx.报警记录
                    .Where(t => t.企业基本信息ID == port.企业基本信息ID)
                    .Where(t => t.设备信息ID == port.ID)
                    .Where(t => t.时间 >= beginMonth).Where(t => t.时间 < endMonth).Count(t => t.内容 != null && t.内容.Contains("污水排放量为") && t.内容.Contains(flag));
                //TODO：这个地方硬编码，可以改
                if (alarm >= 3 * 7) return;
                var contacts1 = CommonInformation.GetContacts(mn);
                if (contacts1 != null)
                {
                    foreach (var c1 in contacts1)
                    {
                        var record = new 报警记录
                        {
                            企业基本信息ID = port.企业基本信息ID,
                            设备信息ID = port.ID,
                            时间 = datatime.Value,
                            内容 = sb.ToString(),
                            短信是否发送 = false,
                            是否需要声光报警 = "否",
                            短信接收人 = c1.联系人姓名,
                            短信手机号 = c1.联系人电话
                        };
                        pCtx.报警记录.Add(record);
                    }
                }
                pCtx.SaveChanges();
                var contacts2 = CommonInformation.GetEnterpriseContacts(mn);
                if (contacts2 != null)
                {
                    foreach (var c1 in contacts2)
                    {
                        var record = new 报警记录
                        {
                            企业基本信息ID = port.企业基本信息ID,
                            设备信息ID = port.ID,
                            时间 = datatime.Value,
                            内容 = sb.ToString(),
                            短信是否发送 = false,
                            是否需要声光报警 = "否",
                            短信接收人 = c1.联系人一姓名,
                            短信手机号 = c1.联系人一电话
                        };
                        pCtx.报警记录.Add(record);
                        record = new 报警记录
                        {
                            企业基本信息ID = port.企业基本信息ID,
                            设备信息ID = port.ID,
                            时间 = datatime.Value,
                            内容 = sb.ToString(),
                            短信是否发送 = false,
                            是否需要声光报警 = "否",
                            短信接收人 = c1.联系人二姓名,
                            短信手机号 = c1.联系人二电话
                        };
                        pCtx.报警记录.Add(record);
                    }
                }
                pCtx.SaveChanges();

            }
            catch (Exception ex)
            {
                Log.Error(ex);
            }
        }

    }
}
